; ____ __ __ _
; | _ \ / _|/ _| | |
; | |_) |_ _| |_| |_ ___ _ __ ___ __ _ _ __ __| |
; | _ <| | | | _| _/ _ \ '__/ __| / _` | '_ \ / _` |
; | |_) | |_| | | | || __/ | \__ \ | (_| | | | | (_| |
; |____/ \__,_|_| |_| \___|_| |___/ \__,_|_| |_|\__,_|
; __ __ _ _ _
; \ \ / / (_) | | | |
; \ \ / /__ _ _ __ _ __ _| |__ | | ___ ___
; \ \/ // _` | '__| |/ _` | '_ \| |/ _ | __|
; \ /| (_| | | | | (_| | |_) | | __|__ \
; \/ \__,_|_| |_|\__,_|_.__/|_|\___|___/
endB0 equ $ ; end of bank 0 marker
dorg >a000
; note: during initialisation, GPLLNK uses >A000 to >A01F as workspace
; to load the upper case characters from console GROM. After this,
; the space is re-used.
; Vectors - the locations of these vectors MUST NOT change between builds
intvec bss 2 ; vector for INTERPRET >a000
blkvec bss 2 ; vector for BLOCK >a002
numvec bss 2 ; vector for NUMBER >a004
fndvec bss 2 ; vector for FIND >a006
usrisr bss 2 ; vector for user isr >a008
kdel bss 2 ; spare - un-used >a00a
dsrvec bss 2 ; pointer to DSRLNK vector in bank 1 >a00c
gplvec bss 2 ; pointer to GPLLNK vector in bank 1 >a00e
padvec bss 2 ; pointer to scratchpad restore code in bank 1. >a010
; Assembly language vector for returning to TF from external assembly code
; that runs in a different workspace.
; External assembly code (for example, code written with the TF assembler)
; that changes workspace can simply perform a BLWP @>A012 to restore TF's
; workspace and jump to NEXT in the inner interpreter, which will restore
; normal Forth execution perfectly.
wp bss 2 ; >a012 - workspace pointer.
; software can actually change TF's workspace while running.
; a copy of the desired workspace address MUST be written
; here so that KEY can restore the correct workspace address
; after its call into the TI ROM.
pnext bss 2 ; >a014 pointer to next
pdocon bss 2 ; >a016 pointer to DOCON's executable code
pcreate bss 2 ; >a018 pointer to CREATE's executable code
; new vectors MUST be added here
; memory space pointers
ffailm bss 2 ; >a01a first free address in low memory pointer
ffaihm bss 2 ; >a01c first free address in hi memory pointer
; stack pointers
s0 bss 2 ; reserved for FORTH variable S0 - holds the address of the
; start of the data stack (r4)
rs0 bss 2 ; address of start of return stack (r5)
; screen, keyboard and file I/O
keydev bss 2 ; keyboard device to use for KSCAN routine in console ROM
cursrd bss 2 ; cursor delay used in KEY and the editor
noscrl bss 2 ; suppress screen scrolling. >0=suppress
scrX bss 2 ; x co-ordinate of next character to be displayed on screen
scrY bss 2 ; y co-ordinate of next character to be displayed on screen
xmax bss 2 ; screen width - 32, 40 or 80
ymax bss 2 ; screen height - always 24
wrap bss 2 ; used to determine if wrap-around is used by SCROLL
panxy bss 2 ; starting screen address (top left) of panel
panr bss 2 ; number of rows in panel
panc bss 2 ; number of columns in panel
errnum bss 2 ; holds io error number of last error
; speech synthesis
spcnt bss 2 ; number of bytes remaining in speech buffer
spadr bss 2 ; address of next byte in speech buffer
spcsvc bss 2 ; speech service: address of the speech service which should
; be called by the ISR is placed here. (either the routine
; to stream raw speech data, or the routine to feed speech
; ROM addresses).
synyes bss 2 ; 0=speech synth not fitted. >FFFF=speech synth detected
; parsing/compilation
in bss 2 ; holds the current index into the terminal input buffer
; (TIB) - used by variable >IN
latest bss 2 ; reserved for FORTH variable LATEST, which points to the
; most recently defined word in the dictionary.
here bss 2 ; points to the next free byte of memory. When compiling,
; compiled words go HERE.
_state bss 2 ; is the interpreter interpreting (0) or compiling a word
; (!=0).
tibsiz bss 2 ; characters per line: 80 on command line, 64 in blocks
_span bss 2 ; the number of characters received by EXPECT.
; See variable #TIB.
doboot bss 2 ; "we're booting" flag (>0=booting)
sdelim bss 2 ; stores the end of string marker (normally ") for S".
; the word .( sets it temporarily to a ) character.
isdbl bss 2 ; flag to indicate if NUMBER pushed a double (>0=yes)
dpl bss 2 ; decimal point location. set by NUMBER (doubles only)
cassen bss 2 ; if 0 dictionary searches are case sensitive
source bss 2 ; source-id. -1=string (via evaluate).
; 0=user input (keyboard/block).
dotsin bss 2 ; flag for .S to use signed or unsigned numbers
base bss 2 ; the current base for printing and reading numbers
lbase bss 2 ; last number base, used by Number to String routine
expcnt bss 2 ; exponent count, used by Number to String routine
lzi bss 2 ; leading zero indicator, used by N>S routine to determine
; if leading 0's are ignored.
dosign bss 2 ; flag for NTS routine. If >0, then NTS will treat numbers
; as unsigned, set by U. and .
_warn bss 2 ; redefinition warnings are suppressed if _warn=0
coding bss 2 ; !0 if CODE: compiling is active
patch bss 2 ; holds the CFA of latest word created with CREATE in case
; DOES> needs to patch it
; misc
vdpr1 bss 2 ; copy of vdp register 1 (stored at 83d4)
retbnk bss 2 ; holds bank number to return to as a memory address
; (>6000 or >6002)
temp bss 2 ; for temporary storage
temp2 bss 2 ; for temporary storage
temp3 bss 2 ; for temporary storage
seed bss 2 ; seed for random number generation
sumode bss 2 ; graphics mode selected from cartridge menu screen
; editor variables - only used by the built in editor
epage bss 2 ; holds block editor page
; note: These variables use the same addresses as the compiler reference
; counters (below). This is safe to do, as the compiler is never in use when
; the editor is in use, and vice versa. Hence it makes sense to use the same
; addresses and save some valuable user RAM in low-memory. I'm nice like that.
csrx equ $ ; cursor x for editor
csry equ $+2 ; cursor y for editor
csrflg equ $+4 ; cursor blink flag for editor
autorp equ $+6 ; keyboard auto repeat counter
autorl equ $+8 ; keyboard auto repeat re-load value
edblk equ $+10 ; block number of the block currently being edited
; reference counters for compiler security
; see the words : and ; in 0-10-Compilation.a99
ifcnt bss 2 ; incremented by IF, decremented by THEN
docnt bss 2 ; incremented by DO, decremented by LOOP & +LOOP
forcnt bss 2 ; incremented by FOR, decremented by NEXT
cascnt bss 2 ; incremented by CASE, decremented by ENDCASE
ofcnt bss 2 ; incremented by OF, decremented by ENDOF
begcnt bss 2 ; incremented by BEGIN, decremented by UNTIL, REPEAT & AGAIN
; sprite buffers
sal bss 128 ; sprite attribute list
smlist bss 64 ; sprite movement list
; Persistable data for file IO
sav8a bss 2 ; save data following blwp @dsrlnk (8 or >a)
savcru bss 2 ; cru address of the peripheral
savent bss 2 ; entry address of dsr or subprogram
savlen bss 2 ; device or subprogram name length
savpab bss 2 ; pointer to device or subprogram in the pab
savver bss 2 ; version # of dsr
flgptr bss 2 ; pointer to flag in pab (byte 1 in pab)
dsrlws bss 10 ; data 0,0,0,0,0 ; dsrlnk workspace
dstype bss 22 ; data 0,0,0,0,0,0,0,0,0,0,0
haa bss 2 ; used to store AA pattern for DSR ROM detection
namsto bss 8 ; dsrlnk 8 bytes device name buffer
; scratch pab - used for block IO
pabopc byte 0 ; opcode: open, read, etc
pabflg byte 0 ; error code & file type
pabbuf data 0 ; vdp address of data
pablrl byte 0 ; logical record length
pabcc byte 0 ; output character count
pabrec data 0 ; record number
pabsco byte 0 ; screen offset for char
pabnln byte 0 ; name length
pabfil bss 32 ; file name starts here
even
; set up the pab pointers:
namptr equ >8356 ; address of pointer to name length in PABs
f1pab equ >1800 ; vdp address of 40 byte PAB buffer for file 1
f1buf equ >1828 ; vdp address of 256 byte record buffer for file 1
f2pab equ >1928 ; vdp address of 40 byte PAB buffer for file 2
f2buf equ >1950 ; vdp address of 256 byte record buffer for file 2
f3pab equ >1a50 ; vdp address of 40 byte PAB buffer for file 3
f3buf equ >1a78 ; vdp address of 256 byte record buffer for file 3
pabloc equ >1b78 ; vdp address of block IO PAB
recbuf equ >1ba0 ; vdp address of data buffer. 128 bytes to store 1 record
bufadd equ >1c20 ; vdp address of block buffer 0
falloc bss 6